#pragma once 

#include <iostream>
#include <cstdlib>
#include <string>
#include <ctime>

#include <cstdarg>
// 日志功能的基本要素:   日志等级  时间   支持用户定义   

//日志等级

#define DEBUG   0 
#define NORMAL  1
#define WARNING 2
#define ERROR   3
#define FATAL   4

//日志内容写入该路径对应的文件
#define LOGFILE "./MyTPLog.log" //log 后缀有什么特殊之处  ？ ？ ？  

const char* gLevelMap[] = 
{
    "DEBUG",
    "NORMAL",
    "WARNING",
    "ERROR",
    "FATAL"
};


                            //const char* format 用于接收自定义格式 
void logMessage(int level , const char* format, ...)  // ... 代表可变参数列表
{
#ifndef DEBUG_SHOW                 // 在马makefile 文件中用 -D 选项调用
    if(level == DEBUG) return ;   
#endif
    
    char stdBuffer[1024];  //标准部分 
    time_t timestamp = time(nullptr);  //获取时间戳
    snprintf(stdBuffer, sizeof stdBuffer , "[%s] [%ld] ",gLevelMap[level],timestamp);

    char logBuffer[1024]; //自定义部分
    va_list args ; //va_list 变量 一个指向可变参数列表的指针类型
    va_start(args,format); // 用于初始化可变参数列表的访问。  //第二个参数是代表最后一个固定参数的前一个参数，用于定位可变参数列表的起始位置。故填format 
    vsnprintf(logBuffer,sizeof logBuffer , format, args);
    //将格式化字符串输出到指定的字符数组中，并使用可变参数列表提供的值进行格式化，但最多只输出指定的字符数
    va_end(args);

    FILE* fp = fopen(LOGFILE,"a");
    fprintf(fp, "%s%s\n",stdBuffer,logBuffer);
    fclose(fp);

    printf("%s%s",stdBuffer,logBuffer);               

}